import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default='notebook'
def analyse_results(results):
# Initialize empty DataFrame to hold summary stats
summary_stats = pd.DataFrame()
fig = go.Figure()
# Loop through the results
for result in results:
# Get general info
range_pct = result["range_pct"]
is_hedged = result["is_hedged"]
backtester = result["backtester"]
# Get backtest DataFrame
backtest_df = backtester.backtest_df
# Calculate key stats
fees_generated = backtest_df["fee"].sum()
losses_due_to_divergence = backtest_df["divergence"].sum()
pnl_total_with_fees = backtest_df.groupby("id")["pnl_total_with_fees"].last().sum()
roi = backtester.roi
max_dd = backtester.max_dd
# Append stats to summary DataFrame
summary_stats = pd.concat([summary_stats, pd.DataFrame({
"Range Percentage": range_pct,
"Is Hedged": is_hedged,
"Number of positions": len(backtest_df.id.unique()),
"Total Fees Generated": fees_generated,
"Losses Due to Divergence": losses_due_to_divergence,
"Total PNL with Fees": pnl_total_with_fees,
"ROI": roi,
"DD": max_dd,
"ID": results.index(result)
}, index=[0])])
# Generate line for each backtest
fig.add_trace(go.Scatter(
x=backtest_df.index,
y=backtest_df['net_usd_capital'],
mode='lines',
name=f'{range_pct}%, {"Hedged" if is_hedged else "Unhedged"}',
#hovertemplate = '<b>Capital</b>: %{y:.2f}<extra></extra>'
))
# Edit layout
fig.update_layout(title='Backtest Capital Over Time for Different Configurations',
height=600,
xaxis_title='Time',
yaxis_title='Net USD Capital',
hovermode="x unified")
fig.show()
# Set index to the configurations for easier referencing
summary_stats.set_index(["Range Percentage", "Is Hedged"], inplace=True)
return summary_stats
summary_stats = analyse_results(results)
# Displaying the summary sorted by ROI
summary_stats.sort_values(by='ROI', ascending=False)